package com.mm.cloth.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import com.google.gson.Gson;
import com.mm.cloth.model.response.LoginResponse;

/**
 * 令牌管理工具类
 * 用于存储和管理用户登录令牌和信息
 */
public class TokenManager {
    
    private static final String PREF_NAME = "mm_cloth_prefs";
    private static final String KEY_TOKEN = "auth_token";
    private static final String KEY_USER_INFO = "user_info";
    private static final String KEY_LOGIN_TIME = "login_time";
    private static final String TAG = "TokenManager";
    
    private static final Gson gson = new Gson();
    
    // 令牌有效期，默认7天（毫秒）
    private static final long TOKEN_EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000L;
    
    /**
     * 保存认证令牌
     * @param context 上下文
     * @param token 认证令牌
     */
    public static void saveToken(Context context, String token) {
        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(KEY_TOKEN, token);
        
        // 保存登录时间
        long currentTime = System.currentTimeMillis();
        editor.putLong(KEY_LOGIN_TIME, currentTime);
        
        editor.apply();
        
        Log.d(TAG, "令牌已保存，登录时间: " + currentTime);
    }
    
    /**
     * 获取认证令牌
     * @param context 上下文
     * @return 认证令牌，如果不存在或已过期则返回null
     */
    public static String getToken(Context context) {
        Log.d(TAG, "=== TokenManager.getToken() 开始 ===");

        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        String token = preferences.getString(KEY_TOKEN, null);

        Log.d(TAG, "从SharedPreferences获取token: " + (token != null ? "成功 (长度:" + token.length() + ")" : "失败"));

        // 如果令牌存在，检查是否过期
        if (token != null) {
            Log.d(TAG, "Token存在，检查是否过期...");
            long loginTime = preferences.getLong(KEY_LOGIN_TIME, 0);
            long currentTime = System.currentTimeMillis();
            boolean isExpired = (currentTime - loginTime) > TOKEN_EXPIRE_TIME;

            Log.d(TAG, "登录时间: " + loginTime);
            Log.d(TAG, "当前时间: " + currentTime);
            Log.d(TAG, "时间差: " + (currentTime - loginTime) + "ms");
            Log.d(TAG, "过期时间: " + TOKEN_EXPIRE_TIME + "ms");
            Log.d(TAG, "是否过期: " + isExpired);

            if (isExpired) {
                Log.w(TAG, "❌ 令牌已过期，清除认证信息");
                // 令牌过期，清除认证信息
                clearAuthInfo(context);
                return null;
            } else {
                Log.d(TAG, "✅ 令牌有效，token前10位: " + token.substring(0, Math.min(10, token.length())));
            }
        } else {
            Log.w(TAG, "❌ 未找到token，用户可能未登录");
        }

        Log.d(TAG, "=== TokenManager.getToken() 结束，返回: " + (token != null ? "有效token" : "null") + " ===");
        return token;
    }
    
    /**
     * 保存用户信息
     * @param context 上下文
     * @param loginResponse 登录响应数据
     */
    public static void saveUserInfo(Context context, LoginResponse loginResponse) {
        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        
        // 保存令牌
        if (loginResponse.getToken() != null) {
            editor.putString(KEY_TOKEN, loginResponse.getToken());
            
            // 保存登录时间
            long currentTime = System.currentTimeMillis();
            editor.putLong(KEY_LOGIN_TIME, currentTime);
            
            Log.d(TAG, "用户信息和令牌已保存，登录时间: " + currentTime);
        }
        
        // 保存用户信息
        String userInfoJson = gson.toJson(loginResponse);
        editor.putString(KEY_USER_INFO, userInfoJson);
        
        editor.apply();
    }
    
    /**
     * 获取用户信息
     * @param context 上下文
     * @return 用户信息，如果不存在或令牌已过期则返回null
     */
    public static LoginResponse getUserInfo(Context context) {
        // 先检查令牌是否有效
        if (!isLoggedIn(context)) {
            Log.d(TAG, "获取用户信息失败：未登录或令牌已过期");
            return null;
        }
        
        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        String userInfoJson = preferences.getString(KEY_USER_INFO, null);
        
        if (userInfoJson != null) {
            try {
                return gson.fromJson(userInfoJson, LoginResponse.class);
            } catch (Exception e) {
                Log.e(TAG, "解析用户信息失败: " + e.getMessage());
                return null;
            }
        }
        
        return null;
    }
    
    /**
     * 清除认证信息
     * @param context 上下文
     */
    public static void clearAuthInfo(Context context) {
        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.remove(KEY_TOKEN);
        editor.remove(KEY_USER_INFO);
        editor.remove(KEY_LOGIN_TIME);
        editor.apply();
        
        Log.d(TAG, "认证信息已清除");
    }
    
    /**
     * 检查是否已登录
     * @param context 上下文
     * @return 是否已登录
     */
    public static boolean isLoggedIn(Context context) {
        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        String token = preferences.getString(KEY_TOKEN, null);
        
        // 如果令牌不存在，则未登录
        if (token == null || token.isEmpty()) {
            Log.d(TAG, "令牌不存在，未登录");
            return false;
        }
        
        // 检查令牌是否过期
        long loginTime = preferences.getLong(KEY_LOGIN_TIME, 0);
        long currentTime = System.currentTimeMillis();
        boolean isExpired = (currentTime - loginTime) > TOKEN_EXPIRE_TIME;
        
        if (isExpired) {
            Log.d(TAG, "令牌已过期，登录时间: " + loginTime + ", 当前时间: " + currentTime);
            // 令牌过期，清除认证信息
            clearAuthInfo(context);
            return false;
        }
        
        // 检查用户信息是否存在
        String userInfoJson = preferences.getString(KEY_USER_INFO, null);
        if (userInfoJson == null || userInfoJson.isEmpty()) {
            Log.d(TAG, "用户信息不存在，未登录");
            return false;
        }
        
        Log.d(TAG, "用户已登录，令牌有效");
        return true;
    }
} 